package com.becapps.easydownloader; import group.pals.android.lib.ui.filechooser.FileChooserActivity; import group.pals.android.lib.ui.filechooser.io.localfile.LocalFile; import group.pals.android.lib.ui.filechooser.services.IFileProvider; import java.io.File; import java.util.List; import java.util.Stack; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.content.pm.ResolveInfo; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.os.Parcelable; import android.preference.CheckBoxPreference; import android.preference.ListPreference; import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceCategory; import android.preference.PreferenceFragment; import android.preference.PreferenceManager; import android.preference.PreferenceScreen; import android.text.format.DateUtils; import android.view.ContextThemeWrapper; import android.view.Menu; import android.view.MenuItem; import android.widget.RelativeLayout; import android.widget.Toast; import com.becapps.easydownloader.ffmpeg.FfmpegController; import com.becapps.easydownloader.service.FfmpegDownloadService; import com.becapps.easydownloader.utils.PopUps; import com.becapps.easydownloader.utils.Utils; import com.google.ads.*; import com.google.ads.AdRequest.ErrorCode; import com.appbrain.AppBrain; public class SettingsActivity extends Activity { public static final String DEBUG_TAG = "SettingsActivity"; private static final int _ReqChooseFile = 0; public static String chooserSummary; static SharedPreferences settings = YTD.settings; static final String PREFS_NAME = YTD.PREFS_NAME; public static Activity mActivity; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Appirater.appLaunched(this); AppBrain.initApp(this); this.setTitle(R.string.title_activity_settings); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage(R.string.quick_start_home).create().show(); settings = getSharedPreferences(PREFS_NAME, 0); // Theme init Utils.themeInit(this); // Language init Utils.langInit(this); // Load default preferences values PreferenceManager.setDefaultValues(this, R.xml.settings, false); // Display the fragment as the main content. getFragmentManager().beginTransaction() .replace(android.R.id.content, new SettingsFragment()) .commit(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_settings, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { super.onOptionsItemSelected(item); switch(item.getItemId()){ case R.id.menu_dm: Intent viewIntent = new Intent(android.app.DownloadManager.ACTION_VIEW_DOWNLOADS); if(viewIntent.resolveActivity(getPackageManager()) != null) { startActivity(viewIntent); } else { Toast.makeText(this, getString(R.string.no_downloads_sys_app), Toast.LENGTH_LONG).show(); } return true; case R.id.menu_tutorials: startActivity(new Intent(this, TutorialsActivity.class)); return true; default: return super.onOptionsItemSelected(item); } } public static class SettingsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener { //private Preference dm; private Preference filechooser; private Preference up; private CheckBoxPreference ownNot; private Preference th; private Preference lang; private static CheckBoxPreference audio; protected int cpuVers; public static String link; public CheckBoxPreference bs; //public WebView webview; public static final int YTD_SIG_HASH = -1892118308; // final string //public static final int YTD_SIG_HASH = -118685648; // dev test: desktop //public static final int YTD_SIG_HASH = 1922021506; // dev test: laptop @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.settings); final ContextThemeWrapper boxThemeContextWrapper = new ContextThemeWrapper(getActivity(), R.style.BoxTheme); mActivity = getActivity(); //webview = new WebView(getActivity()); String cf = settings.getString("CHOOSER_FOLDER", ""); if (cf.isEmpty() && cf != null) { chooserSummary = getString(R.string.chooser_location_summary); } else { chooserSummary = settings.getString("CHOOSER_FOLDER", ""); } initSwapPreference(); initSizePreference(); for(int i=0;i<getPreferenceScreen().getPreferenceCount();i++){ initSummary(getPreferenceScreen().getPreference(i)); } /*dm = (Preference) findPreference("dm"); dm.setOnPreferenceClickListener(new OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { Intent viewIntent = new Intent(android.app.DownloadManager.ACTION_VIEW_DOWNLOADS); if(viewIntent.resolveActivity(getPackageManager()) != null) { startActivity(viewIntent); } else { Toast.makeText(getActivity(), getActivity().getString(R.string.error), Toast.LENGTH_LONG).show(); } return true; } });*/ filechooser = (Preference) getPreferenceScreen().findPreference("open_chooser"); filechooser.setOnPreferenceClickListener(new OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { Intent intent = new Intent(getActivity(), FileChooserActivity.class); if (intent != null) { intent.putExtra(FileChooserActivity._Rootpath, (Parcelable) new LocalFile(Environment.getExternalStorageDirectory())); intent.putExtra(FileChooserActivity._FilterMode, IFileProvider.FilterMode.DirectoriesOnly); startActivityForResult(intent, _ReqChooseFile); } return true; } }); ownNot = (CheckBoxPreference) findPreference("enable_own_notification"); ownNot.setOnPreferenceClickListener(new OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { if (!ownNot.isChecked() && ShareActivity.mId == 1) { ShareActivity.mNotificationManager.cancelAll(); ShareActivity.mId = 0; } return true; } }); th = (Preference) findPreference("choose_theme"); th.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { String theme = settings.getString("choose_theme", "D"); if (theme.equals("D")) { getActivity().setTheme(R.style.AppThemeDark); } else { getActivity().setTheme(R.style.AppThemeLight); } if (!theme.equals(newValue)) reload(); return true; } }); lang = (Preference) findPreference("lang"); lang.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { String language = settings.getString("lang", "default"); if (!language.equals(newValue)) Utils.reload(getActivity()); return true; } }); audio = (CheckBoxPreference) findPreference("enable_audio_extraction"); audio.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { boolean audioExtrEnabled = settings.getBoolean("enable_audio_extraction", false); File binDir = getActivity().getDir("bin", 0); boolean ffmpegInstalled = new File(binDir, "ffmpeg").exists(); if (!audioExtrEnabled) { cpuVers = armCpuVersion(); boolean isCpuSupported = (cpuVers > 0) ? true : false; Utils.logger("d", "isCpuSupported: " + isCpuSupported, DEBUG_TAG); if (!isCpuSupported) { audio.setEnabled(false); audio.setChecked(false); settings.edit().putBoolean("FFMPEG_SUPPORTED", false).commit(); AlertDialog.Builder adb = new AlertDialog.Builder(boxThemeContextWrapper); adb.setIcon(android.R.drawable.ic_dialog_alert); adb.setTitle(getString(R.string.ffmpeg_device_not_supported)); adb.setMessage(getString(R.string.ffmpeg_support_mail)); adb.setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { /* * adapted form same source as createEmailOnlyChooserIntent below */ Intent i = new Intent(Intent.ACTION_SEND); i.setType("*/*"); String content = Utils.getCpuInfo(); /*File destDir = getActivity().getExternalFilesDir(null); String filename = "cpuInfo.txt"; try { Utils.createLogFile(destDir, filename, content); i.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(destDir, filename)));*/ i.putExtra(Intent.EXTRA_EMAIL, new String[] { "niteshbhatia456@gmail.com" }); i.putExtra(Intent.EXTRA_SUBJECT, "Easy Video Downloader: device info report"); i.putExtra(Intent.EXTRA_TEXT, content); startActivity(createEmailOnlyChooserIntent(i, getString(R.string.email_via))); /*} catch (IOException e) { Log.e(DEBUG_TAG, "IOException on creating cpuInfo Log file ", e); }*/ } }); adb.setNegativeButton(getString(R.string.dialogs_negative), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // cancel } }); AlertDialog helpDialog = adb.create(); if (! (getActivity()).isFinishing()) { helpDialog.show(); } } else { settings.edit().putBoolean("FFMPEG_SUPPORTED", true).commit(); } Utils.logger("d", "ffmpegInstalled: " + ffmpegInstalled, DEBUG_TAG); if (!ffmpegInstalled && isCpuSupported) { AlertDialog.Builder adb = new AlertDialog.Builder(boxThemeContextWrapper); adb.setIcon(android.R.drawable.ic_dialog_info); adb.setTitle(getString(R.string.ffmpeg_download_dialog_title)); link = getString(R.string.ffmpeg_download_dialog_msg_link, cpuVers); String msg = getString(R.string.ffmpeg_download_dialog_msg); String ffmpegSize; if (cpuVers == 5) { ffmpegSize = getString(R.string.ffmpeg_size_arm5); } else if (cpuVers == 7) { ffmpegSize = getString(R.string.ffmpeg_size_arm7); } else { ffmpegSize = "n.a."; } String size = getString(R.string.size) + " " + ffmpegSize; adb.setMessage(msg + " " + link + "\n" + size); adb.setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { File sdcardAppDir = getActivity().getExternalFilesDir(null); if (sdcardAppDir != null) { File src = new File(getActivity().getExternalFilesDir(null), FfmpegController.ffmpegBinName); File dst = new File(getActivity().getDir("bin", 0), FfmpegController.ffmpegBinName); if (!src.exists()) { Intent intent = new Intent(getActivity(), FfmpegDownloadService.class); intent.putExtra("CPU", cpuVers); intent.putExtra("DIR", sdcardAppDir.getAbsolutePath()); getActivity().startService(intent); } else { FfmpegDownloadService.copyFfmpegToAppDataDir(getActivity(), src, dst); } } else { Utils.logger("w", getString(R.string.unable_save_dialog_msg), DEBUG_TAG); PopUps.showPopUp(getString(R.string.error), getString(R.string.unable_save_dialog_msg), "alert", getActivity()); } } }); adb.setNegativeButton(getString(R.string.dialogs_negative), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // cancel } }); AlertDialog helpDialog = adb.create(); if (! (getActivity()).isFinishing()) { helpDialog.show(); } } } if (ffmpegInstalled) { return true; } else { return false; } } }); initAudioPreference(); } private int armCpuVersion() { String cpuAbi = Build.CPU_ABI; Utils.logger("d", "CPU_ABI: " + cpuAbi, DEBUG_TAG); if (cpuAbi.equals("armeabi-v7a")) { return 7; } else if (cpuAbi.equals("armeabi")) { return 5; } else { return 0; } } public void reload() { Intent intent = getActivity().getIntent(); intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); getActivity().finish(); getActivity().overridePendingTransition(0, 0); startActivity(intent); getActivity().overridePendingTransition(0, 0); } public void initUpdate() { int prefSig = settings.getInt("APP_SIGNATURE", 0); Utils.logger("d", "prefSig: " + prefSig, DEBUG_TAG); if (prefSig == 0 ) { if (Utils.getSigHash(SettingsFragment.this) == YTD_SIG_HASH) { Utils.logger("d", "Found YTD signature: update check possile", DEBUG_TAG); up.setEnabled(true); if (settings.getBoolean("autoupdate", false)) { Utils.logger("i", "autoupdate enabled", DEBUG_TAG); autoUpdate(getActivity()); } } else { Utils.logger("d", "Found different signature: " + Utils.currentHashCode + " (F-Droid?). Update check cancelled.", DEBUG_TAG); up.setEnabled(false); up.setSummary(R.string.update_disabled_summary); } SharedPreferences.Editor editor = settings.edit(); editor.putInt("APP_SIGNATURE", Utils.currentHashCode); if (editor.commit()) Utils.logger("d", "saving sig pref...", DEBUG_TAG); } else { if (prefSig == YTD_SIG_HASH) { Utils.logger("d", "YTD signature in PREFS: update check possile", DEBUG_TAG); up.setEnabled(true); if (settings.getBoolean("autoupdate", false)) { Utils.logger("i", "autoupdate enabled", DEBUG_TAG); autoUpdate(getActivity()); } } else { Utils.logger("d", "diffrent YTD signature in prefs (F-Droid?). Update check cancelled.", DEBUG_TAG); up.setEnabled(false); } } } private void initSwapPreference() { boolean swap = settings.getBoolean("swap_location", false); PreferenceScreen p = (PreferenceScreen) findPreference("open_chooser"); if (swap == true) { p.setEnabled(true); } else { p.setEnabled(false); } } private void initSizePreference() { CheckBoxPreference s = (CheckBoxPreference) findPreference("show_size"); CheckBoxPreference l = (CheckBoxPreference) findPreference("show_size_list"); if (l.isChecked()) { s.setEnabled(false); s.setChecked(true); } else { s.setEnabled(true); } } private void initAudioPreference() { boolean ffmpegSupported = settings.getBoolean("FFMPEG_SUPPORTED", true); if (ffmpegSupported) { String encode = settings.getString("audio_extraction_type", "extr"); Preference p = (Preference) findPreference("mp3_bitrate"); if (encode.equals("conv") == true) { p.setEnabled(true); } else { p.setEnabled(false); } } else { touchAudioExtrPref(false, false); } } /*@Override public void onStart() { super.onStart(); Utils.logger("v", "_onStart"); }*/ @Override public void onResume(){ super.onResume(); // Set up a listener whenever a key changes getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); Utils.logger("v", "_onResume", DEBUG_TAG); } @Override public void onPause() { super.onPause(); // Unregister the listener whenever a key changes getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); Utils.logger("v", "_onPause", DEBUG_TAG); } /*@Override public void onStop() { super.onStop(); Utils.logger("v", "_onStop"); }*/ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { updatePrefSummary(findPreference(key)); initSwapPreference(); initSizePreference(); initAudioPreference(); } private void initSummary(Preference p){ if (p instanceof PreferenceCategory){ PreferenceCategory pCat = (PreferenceCategory) p; for(int i=0;i<pCat.getPreferenceCount();i++){ initSummary(pCat.getPreference(i)); } }else{ updatePrefSummary(p); } } private void updatePrefSummary(Preference p){ if (p instanceof ListPreference) { ListPreference listPref = (ListPreference) p; p.setSummary(listPref.getEntry()); } if (p instanceof PreferenceScreen && p.getKey().equals("open_chooser")) { p.setSummary(chooserSummary); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case _ReqChooseFile: if (resultCode == RESULT_OK) { @SuppressWarnings("unchecked") List<LocalFile> files = (List<LocalFile>) data.getSerializableExtra(FileChooserActivity._Results); File chooserFolder = files.get(0); chooserSummary = chooserFolder.toString(); Utils.logger("d", "file-chooser selection: " + chooserSummary, DEBUG_TAG); switch (pathCheck(chooserFolder)) { case 0: // Path on standard sdcard setChooserPrefAndSummary(); break; case 1: // Path not writable chooserSummary = ShareActivity.dir_Downloads.getAbsolutePath(); setChooserPrefAndSummary(); PopUps.showPopUp(getString(R.string.system_warning_title), getString(R.string.system_warning_msg), "alert", getActivity()); //Toast.makeText(getActivity(), getString(R.string.system_warning_title), Toast.LENGTH_SHORT).show(); break; case 2: // Path not mounted Toast.makeText(getActivity(), getString(R.string.sdcard_unmounted_warning), Toast.LENGTH_SHORT).show(); } } break; } } public void setChooserPrefAndSummary() { for(int i=0;i<getPreferenceScreen().getPreferenceCount();i++){ initSummary(getPreferenceScreen().getPreference(i)); } settings.edit().putString("CHOOSER_FOLDER", chooserSummary).apply(); } public int pathCheck(File path) { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { if (path.canWrite()) { return 0; } else { Utils.logger("w", "Path not writable", DEBUG_TAG); return 1; } } else { Utils.logger("w", "Path not mounted", DEBUG_TAG); return 2; } } public static void autoUpdate(Context context) { long storedTime = settings.getLong("time", 0); // final string //long storedTime = 10000; // dev test: forces auto update boolean shouldCheckForUpdate = !DateUtils.isToday(storedTime); Utils.logger("i", "shouldCheckForUpdate: " + shouldCheckForUpdate, DEBUG_TAG); if (shouldCheckForUpdate) { //if (settings.getBoolean("DOWNLOAD_PROVIDER_.apk", true)) { //} } long time = System.currentTimeMillis(); if (settings.edit().putLong("time", time).commit()) Utils.logger("i", "time written in prefs", DEBUG_TAG); } public static void touchAudioExtrPref(final boolean enable, final boolean check) { mActivity.runOnUiThread(new Runnable() { public void run() { Utils.logger("d", "audio-extraction-checkbox: " + "enabled: " + enable + " / checked: " + check, DEBUG_TAG); audio.setEnabled(enable); audio.setChecked(check); } }); } /* Intent createEmailOnlyChooserIntent from Stack Overflow: * * http://stackoverflow.com/questions/2197741/how-to-send-email-from-my-android-application/12804063#12804063 * * Q: http://stackoverflow.com/users/138030/rakesh * A: http://stackoverflow.com/users/1473663/nobu-games */ public Intent createEmailOnlyChooserIntent(Intent source, CharSequence chooserTitle) { Stack<Intent> intents = new Stack<Intent>(); Intent i = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto", "info@domain.com", null)); List<ResolveInfo> activities = getActivity().getPackageManager() .queryIntentActivities(i, 0); for(ResolveInfo ri : activities) { Intent target = new Intent(source); target.setPackage(ri.activityInfo.packageName); intents.add(target); } if(!intents.isEmpty()) { Intent chooserIntent = Intent.createChooser(intents.remove(0), chooserTitle); chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intents.toArray(new Parcelable[intents.size()])); return chooserIntent; } else { return Intent.createChooser(source, chooserTitle); } } } }